# Versión de R
R.version.string[1] "R version 4.3.2 (2023-10-31 ucrt)"
FIESTA es una biblioteca del lenguaje de programación R para análisis de datos de inventarios forestales basados en muestras. En este documento se explica el uso de FIESTA mediante un caso de ejemplo basado en un conjunto de datos de parcelas de monitoreo, ubicadas en la zona norte de Costa Rica.
FIESTA (Forest Inventory Estimation and Analysis) es una biblioteca de software, desarrollada en el lenguaje de programación R, para el análisis de datos de inventarios forestales basados en muestras. Es desarrollada por el Programa de Inventario y Análisis Forestal (FIA, por sus siglas en inglés) del Servicio Forestal del Departamento de Agricultura de los Estados Unidos.
Este documento describe el procesamiento, mediante FIESTA, de un conjunto de datos de 26125 puntos de muestreo de 1045 parcelas de monitoreo, ubicadas en la zona norte de Costa Rica.
Para trabajar con FIESTA, se debe instalar:
De acuerdo con su documentación, la versión mínima de R que requiere FIESTA, a la fecha de escritura de este documento (2023-12-02), es la 4.2.0. Puede consultar la versión que tiene instalada al ejecutar el siguiente comando en la consola de R:
# Versión de R
R.version.string[1] "R version 4.3.2 (2023-10-31 ucrt)"
La salida del comando anterior debe indicar que su versión de R es mayor o igual a 4.2.0.
El paquete FIESTA está disponible en CRAN (Comprehensive R Archive Network), un repositorio en línea que alberga una amplia colección de paquetes y extensiones para el lenguaje de programación R, lo que facilita su instalación y actualización a nuevas versiones.
Para usar FIESTA, debe instalarse primero en una interfaz de R. Puede utilizar la función install.packages().
# Instalación del paquete FIESTA
install.packages("FIESTA")El resultado de la instalación puede verificarse al cargar el paquete con la función library().
# Carga del paquete FIESTA
library(FIESTA)Si el comando anterior no genera ningún mensaje de error, FIESTA debe haberse instalado adecuadamente.
Además de FIESTA, se recomienda instalar los siguientes paquetes para procesamiento de datos y visualización de resultados.
# Paquete para el desarrollo de documentos computacionales
install.packages("rmarkdown")
# Colección de paquetes para análisis de datos
install.packages("tidyverse")
# Estilos para gráficos de tidyverse
install.packages("ggthemes")
# Paquete para limpieza de datos
install.packages("janitor")
# Paquete para tablas interactivas
install.packages("DT")
# Paquete para graficación interactiva
install.packages("plotly")
# Paquete para mapas interactivos
install.packages("leaflet")
# Funciones adicionales para leaflet
install.packages("leaflet.extras")
# Funciones adicionales para leaflet
install.packages("leafem")Luego de instalarlos, debe cargar los paquetes con la función library().
# Carga de paquetes adicionales
library(rmarkdown)
library(tidyverse)
library(ggthemes)
library(janitor)
library(DT)
library(plotly)
library(leaflet)
library(leaflet.extras)
library(leafem)
library(sf) # se instala con FIESTAEste documento forma parte de un repositorio en GitHub, una plataforma en línea para compartir código fuente de aplicaciones, basada en el sistema de control de versiones Git. El repositorio contiene el código fuente del documento y los datos que se utilizan en los ejemplos. Su dirección es https://github.com/mesa-monitoreo-puntos/fiesta.
Puede descargar el repositorio, como un archivo ZIP, de https://github.com/mesa-monitoreo-puntos/fiesta/archive/refs/heads/main.zip
También puede “clonarlo” mediante el comando clone de Git:
# Clonación de este repositorio
git clone https://github.com/mesa-monitoreo-puntos/fiesta.git
Una vez que el repositorio haya sido descargado o clonado, puede abrirse con RStudio o con otra herramienta de desarrollo.
En esta sección se definen algunas variables generales del proceso.
# Ruta a los datos de puntos de muestreo
ARCHIVO_PUNTOS <- "datos/catie/ceo-Mangle-1998-2005-2007-2016-2021-sample-data-2022-03-23.csv"
# Colores
COLOR_BOSQUE = "#266900" # Corine CR - Bosque denso
COLOR_HUMEDAL = "#00ccf2" # Corine EU - Water courses
COLOR_NO_DETERMINABLE = "#000000" # Negro
COLOR_PASTOS = "#ffffa6" # Corine CR - Pastos limpios
COLOR_AGRICULTURA = "#Becd05" # Corine CR - Mosaico de cultivos
COLOR_OTRAS_CLASES = "#005acf" # Corine CR - Canales
COLOR_PLANTACION_FORESTAL = "#55ff00" # Corine CR - Plantación forestal
COLOR_NULO = "#808080" # Gris
# Paleta de colores de tipos de uso de la tierra
COLORES_USO <-
c(
"Bosque" = COLOR_BOSQUE,
"T1-Bosque" = COLOR_BOSQUE,
"T2-Bosque" = COLOR_BOSQUE,
"Humedal" = COLOR_HUMEDAL,
"T1-Humedal" = COLOR_HUMEDAL,
"T2-Humedal" = COLOR_HUMEDAL,
"No determinable" = COLOR_NO_DETERMINABLE,
"T1-No determinable" = COLOR_NO_DETERMINABLE,
"T2-No determinable" = COLOR_NO_DETERMINABLE,
"Pastos" = COLOR_PASTOS,
"T1-Pastos" = COLOR_PASTOS,
"T1-Pastos" = COLOR_PASTOS,
"Agricultura" = COLOR_AGRICULTURA,
"T1-Agricultura" = COLOR_AGRICULTURA,
"T2-Agricultura" = COLOR_AGRICULTURA,
"Otras clases" = COLOR_OTRAS_CLASES,
"T1-Otras clases" = COLOR_OTRAS_CLASES,
"T2-Otras clases" = COLOR_OTRAS_CLASES,
"Plantación Forestal" = COLOR_PLANTACION_FORESTAL,
"T1-Plantación Forestal" = COLOR_PLANTACION_FORESTAL,
"T2-Plantación Forestal" = COLOR_PLANTACION_FORESTAL,
"Nulo" = COLOR_NULO,
"T1-Nulo" = COLOR_NULO,
"T2-Nulo" = COLOR_NULO
)
# Área de estudio en hectáreas
AREA_ESTUDIO = 318167.67El conjunto de datos que se utiliza en este documento para ilustrar el uso de FIESTA es el producto de la interpretación de 1045 parcelas en la zona norte de Costa Rica. Cada parcela contiene 25 puntos, por lo que el total de puntos es 26125. Cada punto se interpretó, mediante imágenes satelitales, en dos tiempos:
La interpretación fue realizada por un equipo de 26 personas de diferentes instituciones y organizaciones.
Los datos de puntos de muestreo se cargan de un archivo CSV y los nombres de las columnas se “limpian” para evitar números al inicio y otros problemas que dificultan su manejo.
# Carga de datos de puntos de muestreo
puntos <- read_delim(ARCHIVO_PUNTOS)
# Cambio de tipo de datos
puntos <-
puntos |>
mutate(
plotid = as.numeric(plotid),
sampleid = as.numeric(sampleid)
)
# Adición de una columna con números consecutivos
puntos <-
puntos |>
mutate(
id = row_number()
) |>
select(id, everything())
# Limpieza de los nombres de columnas
puntos <- clean_names(puntos)
# Cambio de nombre de columnas
puntos <- puntos |>
rename(
plot_id = plotid,
sample_id = sampleid,
t1_uso = clase_de_uso_1998,
t2_uso = clase_de_uso_21
)
# Eliminación de espacios en blanco al inicio y al final
puntos <- puntos |>
mutate(
t1_uso = trimws(t1_uso),
t2_uso = trimws(t2_uso)
)
# Reemplazo de valores NA por la hilera "Nulo"
puntos <-
puntos |>
mutate(
t1_uso = replace_na(t1_uso, "Nulo"),
t1_uso = replace_na(t1_uso, "Nulo")
)
# Coversión de t1_uso y t2_uso a factores
puntos <-
puntos |>
mutate(
t1_uso = factor(t1_uso, levels = unique(t1_uso)),
t2_uso = factor(t2_uso, levels = unique(t2_uso))
)# Despliegue de los datos de puntos de muestreo en una tabla
puntos |>
select(plot_id, sample_id, t1_uso, t2_uso) |>
datatable(
caption = "Puntos de muestreo de uso de la tierra",
rownames = FALSE,
colnames = c(
"plot_id", "sample_id",
"t1_uso", "t2_uso"
),
options = list(
pageLength = 5,
language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
)
)# Conversión de datos de puntos de muestreo a objeto sf (vectorial de puntos)
geo_puntos <-
puntos |>
select(plot_id, sample_id, lon, lat, t1_uso, t2_uso) |>
st_as_sf(
coords = c("lon", "lat"),
crs = 4326
)
colores <-
colorFactor(
palette = c(
COLOR_BOSQUE, COLOR_HUMEDAL, COLOR_NO_DETERMINABLE, COLOR_PASTOS,
COLOR_AGRICULTURA, COLOR_OTRAS_CLASES, COLOR_PLANTACION_FORESTAL
),
levels = c(
"Bosque", "Humedal", "No determinable", "Pastos",
"Agricultura", "Otras clases", "Plantación Forestal"
)
)
leaflet() |>
addTiles(group = "OSM") |>
addProviderTiles(
provider = providers$Esri.WorldImagery,
group = "ESRI World Imagery"
) |>
addProviderTiles(
provider = providers$CartoDB.DarkMatter,
group = "Dark Matter"
) |>
addCircleMarkers(
data = geo_puntos,
radius = 2,
fillColor = ~colores(geo_puntos$t1_uso),
color = ~colores(geo_puntos$t1_uso),
# clusterOptions = markerClusterOptions(),
popup = paste(
paste0("<strong>Parcela: </strong>", geo_puntos$plot_id),
paste0("<strong>Muestra: </strong>", geo_puntos$sample_id),
paste0("<strong>Uso en t1: </strong>", geo_puntos$t1_uso),
paste0("<strong>Uso en t2: </strong>", geo_puntos$t2_uso),
sep = '<br/>'
),
group = "Uso en t1"
) |>
addLegend(
position = "bottomleft",
pal = colores,
values = geo_puntos$t1_uso,
title = "Uso en t1",
group = "Uso en t1"
) |>
addCircleMarkers(
data = geo_puntos,
radius = 2,
fillColor = ~colores(geo_puntos$t2_uso),
color = ~colores(geo_puntos$t2_uso),
# clusterOptions = markerClusterOptions(),
popup = paste(
paste0("<strong>Parcela: </strong>", geo_puntos$plot_id),
paste0("<strong>Muestra: </strong>", geo_puntos$sample_id),
paste0("<strong>Uso en t1: </strong>", geo_puntos$t1_uso),
paste0("<strong>Uso en t2: </strong>", geo_puntos$t2_uso),
sep = '<br/>'
),
group = "Uso en t2"
) |>
addLegend(
position = "bottomleft",
pal = colores,
values = geo_puntos$t2_uso,
title = "Uso en t2",
group = "Uso en t2"
) |>
addLayersControl(
baseGroups = c("OSM", "ESRI World Imagery", "Dark Matter"),
overlayGroups = c("Uso en t1", "Uso en t2"),
)